package com.xbongbong.pro.statistic.pojo.vo;

import com.google.common.collect.Maps;
import com.xbongbong.paas.enums.ScreenTypeEnum;
import com.xbongbong.paas.enums.bi.DataSetNodeTypeEnum;
import com.xbongbong.paas.toolbox.wrap.BaseVO;
import com.xbongbong.pro.statistic.constant.DataSetConstant;
import com.xbongbong.pro.statistic.pojo.DataSetRuleSamePojo;
import com.xbongbong.saas.constant.BasicConstant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
public class DataSetRuleVO extends BaseVO {
    private static final long serialVersionUID = -5552624637910882895L;

    /**
     * 节点表头字段数量限制
     * key：节点类型，用枚举DataSetNodeTypeEnum的alias标识
     * value该节点表头限制数量
     */
    private Map<String, Integer> fieldCount;
    /**
     * 数据源可选字段fieldType集合
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> showAble;
    /**
     * 可以作为筛选条件的字段fieldType集合
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> selectAble;

    /**
     * 禁止作为筛选条件的字段attr集合，为各个业务具体的attr（根据业务类型区分，比如合同关联产品的text_1不允许）
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private Map<String, ArrayList<String>> unSelectAble;
    /**
     * ----unionAble和sameField是结合的，首先unionAble控制哪些字段fieldType能合并，然后sameField控制哪些不同的fieldType可以作为一类处理
     * 哪些类型字段能作为合并字段
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> unionAble;
    /**
     * （主要合并、连接节点使用）用来标识不同类型的fieldType，但可以当做一类的情况：就算fieldType不同，但是也可以当做一类进行合并或连接
     * （开发过程中可能还需要处理虽然fieldType一样，但是不能合并到一列的情况 - 比如ReturnEnum#ORDERER_ID下单人是字符串的人id，但是其他很多是用作long类型的主键id）
     * key为attrType（如date、text、num等），value为fieldType数组
     */
    private DataSetRuleSamePojo sameField;
    /**
     * 禁止作为合并字段的attr集合（根据业务类型区分，比如无团队表的一些表单不能把负责人进行合并）
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private Map<String, List<String>> unUnionAble;
    /**
     * 哪些类型字段能作为连接字段
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> linkAble;
    /**
     * 可以连接的字段类型（比如id和连接id及关联业务单选） - 仅用作连接节点，选中key之后，value可选的范围  （sameField 是Attr前缀相同，此处是attr前缀可能不同）
     * key为字段fieldType.toString
     * value为该key（该fieldType）对应可以连接的字段fieldType集合
     */
    private Map<String,List<Integer>> linkFields;
    /**
     * 可以作为分组字段的fieldType集合
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> groupAble;
    /**
     * 可以作为汇总字段的fieldType集合
     * @see com.xbongbong.paas.enums.FieldTypeEnum
     */
    private List<Integer> summaryAble;
    /**
     * 各节点对字段screeType的要求，字段的screenType不为null时限制该条件
     * key：select（过滤条件）、union（合并节点合并字段）、join（连接节点连接字段）、group（分组节点分组字段）
     * value：screeType集合 {@link ScreenTypeEnum}
     */
    private Map<String, List<Integer>> screenTypeAble;

    public DataSetRuleVO(){
        this.fieldCount = Maps.newHashMapWithExpectedSize(BasicConstant.FOUR);
        //目前都限制100
        this.fieldCount.put(DataSetNodeTypeEnum.INPUT.getAlias(), DataSetConstant.MAX_FIELD_COUNT);
        this.fieldCount.put(DataSetNodeTypeEnum.UNION.getAlias(), DataSetConstant.MAX_FIELD_COUNT);
        this.fieldCount.put(DataSetNodeTypeEnum.JOIN.getAlias(), DataSetConstant.MAX_FIELD_COUNT);
        this.fieldCount.put(DataSetNodeTypeEnum.GROUP.getAlias(), DataSetConstant.MAX_FIELD_COUNT);
        this.showAble = new ArrayList<>();
        this.selectAble = new ArrayList<>();
        this.unionAble = new ArrayList<>();
        this.sameField = new DataSetRuleSamePojo();
        this.linkAble = new ArrayList<>();
        this.groupAble = new ArrayList<>();
        this.summaryAble = new ArrayList<>();
        this.screenTypeAble = ScreenTypeEnum.dataSetScreenTypeAble();
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addShowAble(Integer fieldType){
        this.showAble.add(fieldType);
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addSelectAble(Integer fieldType){
        this.selectAble.add(fieldType);
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addUnionAble(Integer fieldType){
        this.unionAble.add(fieldType);
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addLinkAble(Integer fieldType){
        this.linkAble.add(fieldType);
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addGroupAble(Integer fieldType){
        this.groupAble.add(fieldType);
    }

    /**
     * 字段类型塞入集合
     * @param fieldType
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public void addSummaryAble(Integer fieldType){
        this.summaryAble.add(fieldType);
    }
}
